#include "SmartPtr.hpp"
#include <string>

using namespace cyq;
class A
{
public:
    A(int a = 0)
        : _a(a)
    {
        std::cout << "A(int a = 0)" << std::endl;
    }
    ~A()
    {
        std::cout << _a << " -> ~A()" << std::endl;

        _a = 0;
    }
    int _a;
};

int main()
{
    // cyq::auto_ptr<A> ap(new A(1));

    // cyq::unique_ptr<A> up(new A(2));

    // shared_ptr<A> ptr1(new A(1));
    // shared_ptr<A> ptr2(new A(2));
    // shared_ptr<A> ptr3(ptr1);
    // ptr2 = ptr1;
    // ptr1->_a++;
    // ptr2->_a++;
    // ptr3->_a++;
    // std::cout << ptr1->_a << std::endl;

    // cyq::shared_ptr<A> ptr4(new A(1));
    // cyq::shared_ptr<A> ptr5(new A(2));
    // cyq::shared_ptr<A> ptr6(ptr4);
    // cyq::shared_ptr<A> ptr7(ptr4);
    // cyq::shared_ptr<A> ptr8(new A(3));
    // cyq::shared_ptr<A> ptr9(new A(4));

    // ptr8 = ptr6;
    // ptr9 = ptr6;

    // // 自己给自己赋值
    // cyq::shared_ptr<A> ptr10(new A(5));
    // ptr10 = ptr10;
    // ptr8 = ptr9;

    struct Node
    {
        A _val;
        // cyq::shared_ptr<Node> _next;
        // cyq::shared_ptr<Node> _prev;

        cyq::weak_ptr<Node> _next;
        cyq::weak_ptr<Node> _prev;
    };

    cyq::shared_ptr<Node> ptr1(new Node);
    cyq::shared_ptr<Node> ptr2(new Node);

    // weak_ptr的原理--不增加引用计数，也不参与资源的释放，可以访问资源
    std::cout << ptr1.use_count() << std::endl;
    std::cout << ptr2.use_count() << std::endl;

    // 导致循环引用的问题-->导致内存泄露-->改成weak_ptr-->不具备RAII，专门用来解决shared_ptr引起的循环引用问题
    // 不支持原生指针初始化，可以用weak_ptr去拷贝和赋值，用shared_ptr去赋值
    ptr1->_next = ptr2;
    ptr2->_prev = ptr1;

    std::cout << ptr1.use_count() << std::endl;
    std::cout << ptr2.use_count() << std::endl;

    // 访问
    std::cout << ++(ptr2->_prev)->_val._a << std::endl;

    return 0;
}